package com.evil.common.application.dto.robot;

import com.evil.common.application.dto.judge.JudgeOr;
import com.evil.common.core.enums.SwitchEnum;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * 机器人配置实体
 *
 * @author liyang
 * @date 2022-08-08 00:00
 */
@Data
public class RobotConfigDTO {

    /**
     * 同步(0:关, 1:开)
     */
    private Integer sync;

    /**
     * 目标应用
     */
    private Long targetAppId;

    /**
     * 或条件列表
     */
    @Valid
    private List<JudgeOr> judgeOrs;

    /**
     * 机器人规则
     */
    @Valid
    private List<RobotRuleDTO> robotRules;

    /**
     * 若找不到符合筛选条件的数据，则根据以下规则在目标应用中添加一条数据 (开关值0-1)
     */
    private Integer unConditionAdd;

    /**
     * 是否开启重新触发数据关联或公式(0:否, 1:是)
     */
    @NotNull(message = "是否开启重新触发数据关联或公式参数不能为空")
    private Integer recalculation;

    /**
     * 重新触发数据关联或公式的控件id集合
     */
    private List<Long> recalculationControlIds;

    public RobotConfigDTO() {
        this.sync = SwitchEnum.NO.getId();
        this.judgeOrs = new ArrayList<>();
        this.robotRules = new ArrayList<>();
        this.unConditionAdd = SwitchEnum.NO.getId();
        this.recalculationControlIds = new ArrayList<>();
    }

    /**
     * 是否有规则
     *
     * @return boolean
     */
    public boolean hasRule() {
        return !this.robotRules.isEmpty();
    }

    /**
     * 若找不到符合筛选条件的数据，则根据以下规则在目标应用中添加一条数据
     *
     * @return boolean
     */
    public boolean unConditionAdd() {
        return SwitchEnum.isOpen(unConditionAdd);
    }

    public String info() {
        return String.format("同步: %s，目标应用ID: %s，不符筛选条件: %s，重新触发: %s",
                this.sync, this.targetAppId, this.unConditionAdd, this.recalculation);
    }
}
